#ifndef LEG_MOTOR_SOCKETCAN_HPP
#define LEG_MOTOR_SOCKETCAN_HPP

#include <chrono>
#include <memory>
#include <string>


#include <iostream>
#include <cstring>
#include <unistd.h>
#include <sys/socket.h>
#include <sys/ioctl.h>
#include <net/if.h>
#include <linux/can.h>
#include <linux/can/raw.h>

namespace leg_motor_hardware_interface
{
class leg_motor_socketcan
{
private:
    int socket_fd_;
    struct sockaddr_can addr_;
    struct ifreq ifr_;

    int encorder_counts_{524288}; // 输出端编码器一圈的位数
    u_int32_t leg_motor_id_{0x642U}; // 大腿电机canid

public:
    leg_motor_socketcan();
    ~leg_motor_socketcan();
    // 初始化socketcan通信
    bool init(const char* ifname);
    // 启动电机,开启力矩模式
    bool leg_motor_start();
    // 电机失能
    bool leg_motor_shutdown();
    // 设置电机扭矩(输入参数为扭矩单位Nm)
    void leg_motor_effort_control(double effort);
    // 读取电机负载端位置(返回的位置单位为rad,为单圈绝对位置)
    double leg_motor_position_read();
    // 读取电机实际扭矩(返回扭矩单位为Nm)
    double leg_motor_effort_read();
};

}


#endif